# -*- coding: utf-8 -*-
# @Author  : gaoyu
# @Time    : 2024/2/7 9:34 AM
# @Function:

class Confluence:
    """
    呈村流域汇流
    """

    def __init__(self):
        self.QU = None
        self.dt = None
        self.F = None
        self.QU0 = None
        self.QG = None
        self.QI = None
        self.QS = None
        self.RG = None
        self.RI = None
        self.RS = None
        self.RIM = None
        self.IM = None
        self.CR = None
        self.CG = None
        self.CI = None
        self.CS = None

    def SetParmameter(self, parameter):
        """
        设置参数
        :param parameter:
        :return:
        """
        self.CS = parameter.m_CS
        self.CI = parameter.m_CI
        self.CG = parameter.m_CG
        self.CR = parameter.m_CR
        self.IM = parameter.m_IM

    def SetState(self, state):
        self.RIM = state.m_RIM
        self.RS = state.m_RS
        self.RI = state.m_RI
        self.RG = state.m_RG
        self.QS = state.m_QS
        self.QI = state.m_QI
        self.QG = state.m_QG
        self.QU0 = state.m_QU
        self.F = state.m_F
        self.dt = state.m_dt

    def calculate(self):
        # 把透水面积上的产流量均摊到单元流域上
        RS = float(self.RS) * (1 - float(self.IM))
        RI = float(self.RI) * (1 - float(self.IM))
        RG = float(self.RG) * (1 - float(self.IM))
        # 出流系数换算
        M = 24.0 / float(self.dt)  # 一天划分的计算时段数
        CSD = pow(float(self.CS), 1.0 / M)  # 计算时段内地面径流蓄水库的消退系数
        CID = pow(float(self.CI), 1.0 / M)  # 计算时段内壤中流蓄水库的消退系数
        CGD = pow(float(self.CG), 1.0 / M)  # 计算时段内地下水蓄水库的消退系数
        CRD = pow(float(self.CR), 1.0 / M)  # 计算时段内河网蓄水消退系数

        # 坡地汇流
        U = self.F / 3.6 / 24  # 单位转换系数
        QS = CSD * self.QS + (1 - CSD) * (RS + self.RIM) * U  # 地面径流流入地面径流水库，
        # 经过消退(CSD)，成为地面径流对河网的总入流QS
        QI = CID * self.QI + (1 - CID) * RI * U  # 壤中流流入壤中流水库，
        # 经过消退(CID)，成为壤中流对河网的总入流QI
        QG = CGD * self.QG + (1 - CGD) * RG * U  # 地下径流进入地下水蓄水库，经过地下水
        # 蓄水库的消退(CGD)，成为地下水对河网的总入流QG
        QT = QS + QI + QG

        # 河网汇流，采用线性水库法，且仅当单元流域面积大于200km2时才计算河网汇流
        if self.F < 200:
            self.QU = QT  # 单元流域面积不大且河道较短，对水流运动的调蓄作用通常较小
            # 将这种调蓄作用合并在地面径流和地下径流中一起考虑所带来的误差通常可以忽略
        else:
            self.QU = CRD * self.QU + (1 - CRD) * QT  # 线性水库法
            # 只有在单元流域面积较大或流域坡面汇流极其复杂时
            # 才考虑单元面积内的河网汇流

    def UpdateState(self, state):
        state.m_QS = self.QS
        state.m_QI = self.QI
        state.m_QG = self.QG
        state.m_QU = self.QU
        state.m_QU0 = self.QU0
